package org.zxt.web.context.mybatis.plugin.pagehelper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import org.zxt.web.context.mybatis.plugin.pagehelper.page.PageMethod;

import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;


/**
 * Created by xausky on 3/23/17.
 */
public class PageHelper extends PageMethod {

    /**
     * 只支持单表的分页和排序功能，暂不支持多表联查的情况
     * 多表情况需要手写sql
     *
     * @param <E>         E
     * @param pageRequest pageRequest
     * @param select      select
     * @return Page Page
     */
    public static <E> IPage<E> doPageAndSort(IPage<E> pageRequest, Supplier<List<E>> select) {
        try {
            if (pageRequest.getCurrent() >= 0 && pageRequest.getSize() > 0) {
                startPageAndSort(pageRequest);
                select.get();
                return getLocalPage();
            } else {
                startSort(pageRequest.orders());
                return selectAllAsOnePage(select);
            }
        } finally {
            clearPage();
            clearSort();
        }
    }

    /**
     * 只支持单表的分页和排序功能，暂不支持多表联查的情况
     * 多表情况需要手写sql
     *
     * @param <E>         E
     * @param pageRequest pageRequest
     * @param select      select
     * @return Page Page
     */
//    public static <E> IPage<E> doPageAndSort(Pageable pageRequest, Supplier<List<E>> select) {
//        try {
//            if (pageRequest.getPageNumber() >= 0 && pageRequest.getPageSize() > 0) {
//                startPageAndSort(pageRequest);
//                select.get();
//                return getLocalPage();
//            } else {
//                startSort(pageRequest.getSort().stream().map(item -> {
//                    return new OrderItem(item.getProperty(), item.getDirection().isAscending());
//                }).collect(Collectors.toList()));
//                return selectAllAsOnePage(select);
//            }
//        } finally {
//            clearPage();
//            clearSort();
//        }
//    }

    private static <E> IPage<E> selectAllAsOnePage(Supplier<List<E>> select) {
        List<E> list = select.get();
        int total = list.size();
        return new com.baomidou.mybatisplus.extension.plugins.pagination.Page<E>(0, 0, total);
    }
}
